VM 이미지를 EC2로 가져오기
안녕하세요 클래스메소드의 이수재입니다.
VM Import란?
기존 온프레미스 환경 또는 다른 클라우드 환경에서 실행 중인 가상 머신(VM)을 AWS로 가져와 사용할 수 있도록 지원하는 서비스입니다.
이를 통해 기존 VM을 손쉽게 AWS EC2 인스턴스로 전환하거나, 필요 시 AWS에서 다시 온프레미스 환경으로 내보낼 수도 있습니다.
온프레미스 VM 이미지를 AMI로 변환할 수 있으며 변환된 AMI를 사용하여 EC2 인스턴스를 생성할 수 있습니다.
지원하는 VM의 이미지 형식으로는 VMDK (VMware), VHD/VHDX (Hyper-V), OVA (Open Virtual Appliance) 등이 있습니다.
또한 대부분의 운영 체제[^1]를 대상으로 사용할 수 있습니다.
VM Import를 이용하는 장점으로는 기존 온프레미스 또는 다른 클라우드 환경의 VM을 그대로 가져와 AWS에서 실행 가능하기 때문에 기존 환경을 재사용 할 수 있다는 점이 있습니다.
또한 다른 마이그레이션 방식과 비교하여 비용이 저렴하다는 장점이 있습니다.
한가지 오해할 수 있는 점이지만 VM Import는 S3에 업로드 된 VM 이미지를 AMI로 변환해주는 서비스이지 온프레미스의 VM을 한번에 AMI로 변경해주는 서비스가 아닙니다.
작업의 개요에 대해서는 다음 공식 문서를 참고해주세요.
VM을 바탕으로 EC2를 생성하는 다른 방법
VM Import 이외에도 VM을 바탕으로 Ec2를 생성하는 방법들은 있습니다.
VM 환경을 AWS에 직접 배포하는 방법으로 VM 환경을 도커 컨테이너로 변환 후 Amazon ECS 또는 EKS 사용하는 방법이 있습니다.
컨테이너화 도구를 사용하여 진행하며 VM이 컨테이너화를 하기에 적합한 경우 마이그레이션을 하며 컨테이너화까지 진행하기 위해 도입하는 방식이기도 합니다.
다르게 말하면 컨테이너가 불가능한 환경일 경우 채택하기 어려운 방법입니다.
이외에 AWS Application Migration Service (이하 MGN)을 사용하는 방법이 있습니다.
MGN 은 마이그레이션을 돕는 리프트 앤 시프트 서비스입니다.
온프레미스, 타 클라우드 환경, 다른 리전 등을 대상으로 사용할 수 있습니다.
진행 방법으로는 MGN 에이전트를 VM에 설치하고 동기화를 수행한 뒤 EC2 복제본을 생성하는 식입니다.
지속적인 동기화가 이루어져서 다운타임을 최소화 할 수 있는 장점이 있습니다.
이 외에 EC2에서 완전히 새롭게 환경을 구축하거나 서드 파티의 제품을 이용하는 방법 등도 있습니다.
해보기
이동 전 환경
확인을 위해 바탕화면에 텍스트 파일을 만들어 두고 해당 파일을 포함하여 EC2에 그대로 이동되는지 확인해보겠습니다.
이미지 생성 및 S3 업로드
되도록이면 필요한 디스크만 남겨서 이미지의 크기는 최소화 하는 것이 좋습니다.
필요한 디스크만 남았다면 VM의 이미지를 생성합니다.
생성 방법에 대해서는 각 소프트웨어의 이미지 생성 방법을 참고해주세요.
이미지가 생성되었다면 S3 버킷에 이미지를 업로드합니다.
IAM 서비스 역할 만들기
우선 VM Import를 수행하기 위해서 작업을 수행하는 사용자 혹은 역할에는 다음 권한이 필요합니다.
필요 권한(export가 불필요하다면 export 관련은 삭제)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::{import 용 버킷}",
"arn:aws:s3:::{import 용 버킷}/*",
"arn:aws:s3:::{export 용 버킷}",
"arn:aws:s3:::{export 용 버킷}/*"
]
},
{
"Effect": "Allow",
"Action": [
"ec2:CancelConversionTask",
"ec2:CancelExportTask",
"ec2:CreateImage",
"ec2:CreateInstanceExportTask",
"ec2:CreateTags",
"ec2:DescribeConversionTasks",
"ec2:DescribeExportTasks",
"ec2:DescribeExportImageTasks",
"ec2:DescribeImages",
"ec2:DescribeInstanceStatus",
"ec2:DescribeInstances",
"ec2:DescribeSnapshots",
"ec2:DescribeTags",
"ec2:ExportImage",
"ec2:ImportInstance",
"ec2:ImportVolume",
"ec2:StartInstances",
"ec2:StopInstances",
"ec2:TerminateInstances",
"ec2:ImportImage",
"ec2:ImportSnapshot",
"ec2:DescribeImportImageTasks",
"ec2:DescribeImportSnapshotTasks",
"ec2:CancelImportTask"
],
"Resource": "*"
}
]
}
VM Import/Export를 사용하려면 사용자를 대신하여 특정 작업을 수행할 역할(서비스 역할)이 필요합니다.
VM Import/Export가 역할을 맡을 수 있도록 허용하는 신뢰 관계 정책 문서와 함께 vmimport
라는 서비스 역할을 생성해야 하며 역할에 IAM 정책을 첨부해야 합니다.
AWS CLI나 콘솔을 활용하여 다음 신뢰 정책이 포함된 IAM 역할 vmimport
를 생성합니다.
신뢰 정책
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "vmie.amazonaws.com" },
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals":{
"sts:Externalid": "vmimport"
}
}
}
]
}
해당 역할에는 다음 권한을 부여합니다.
필요 권한(export가 불필요하다면 export 관련은 삭제)
{
"Version":"2012-10-17",
"Statement":[
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::{import용 버킷}",
"arn:aws:s3:::{import용 버킷}/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:GetObject",
"s3:ListBucket",
"s3:PutObject",
"s3:GetBucketAcl"
],
"Resource": [
"arn:aws:s3:::{export용 버킷}",
"arn:aws:s3:::{export용 버킷}/*"
]
},
{
"Effect": "Allow",
"Action": [
"ec2:ModifySnapshotAttribute",
"ec2:CopySnapshot",
"ec2:RegisterImage",
"ec2:Describe*"
],
"Resource": "*"
}
]
}
### VM Import 실행
```aws ec2 import-image``` 명령을 실행하여 VM 이미지를 AMI로 가져옵니다.
ImportImage API를 사용하여 이미지를 AWS로 가져올 때 AWS는 파일 시스템을 수정합니다.
수정 파일을 작성할 때 AWS는 동일한 위치에 새로운 이름으로 파일을 보관합니다.
상세한 내용은 다음 문서를 참고해주세요.
https://docs.aws.amazon.com/ko_kr/vm-import/latest/userguide/import-modify-vm.html
실행하는 명령어는 다음과 같습니다.
``` bash
aws ec2 import-image --description "VM Import Test" --disk-containers "file://vmimport.json"
vmimport.json
의 내용은 다음과 같습니다.
vmimport.json (
[
{
"Description": "Test VM Image",
"Format": "ova",
"UserBucket": {
"S3Bucket": "sujae-test-vm-import", # VM 이미지가 저장된 버킷 이름
"S3Key": "test.ova" # VM 이미지 이름
}
}
]
{
"Description": "VM Import Test",
"ImportTaskId": "import-ami-62acdc8d081544a6t",
"Progress": "1",
"SnapshotDetails": [
{
"Description": "Test VM Image",
"DiskImageSize": 0.0,
"Format": "ova",
"UserBucket": {
"S3Bucket": "sujae-test-vm-import",
"S3Key": "test.ova"
}
}
],
"Status": "active",
"StatusMessage": "pending"
}
Import 진행 상황 확인
다음 명령어를 실행하여 VM Import의 진행 상황을 확인할 수 있습니다.
aws ec2 describe-import-image-tasks
:::detail 실행 결과
{
"ImportImageTasks": [
{
"Description": "VM Import Test",
"ImageId": "",
"ImportTaskId": "import-ami-62acdc8d081544a6t",
"Progress": "9",
"SnapshotDetails": [
{
"DiskImageSize": 5574185984.0,
"Format": "VMDK",
"Status": "active",
"UserBucket": {
"S3Bucket": "sujae-test-vm-import",
"S3Key": "test.ova"
}
}
],
"Status": "active",
"StatusMessage": "converting",
"Tags": []
}
]
}
진행 상황은 Progress
를 보고 판단할 수 있습니다.
Import가 완료되면 StatusMessage가 completed
로 바뀌고 AMI ID를 확인할 수 있습니다.
Statis<essage에 대한 상세한 내용은 아래 공식 문서를 참고해주세요.
확인해보기
EC2를 생성할 때 내 AMI를 확인해보면 다음과 같이 추가된 것을 확인할 수 있습니다.
이 AMI로 EC2를 만들어보면 VM에서 생성한 텍스트 파일을 확인할 수 있습니다.
마무리
이상으로 VM 환경을 바탕으로 EC2를 만드는 VM Import에 대하여 알아보았습니다.
반대로 인스턴스 환경을 바탕으로 VM 이미지를 만드는 것도 가능합니다.
그리고 설명했듯이 VM Import 이외에도 VM 환경을 EC2로 만드는 여러 방법이 있으니 현재 상황에 맞는 방법을 검증하고 도입하시길 바랍니다.
긴 글 읽어주셔서 감사합니다.
오탈자 및 내용 피드백은 must01940 지메일로 보내주시면 감사합니다.
참고 자료
[^1] : Linux 배포판(예: Ubuntu, CentOS, RHEL 등) 및 Windows Server 등